package com.itany.corejava.code06_面向对象;

/**
 * @author 石小俊
 * @date 2024年01月15日 13:57
 */
public class Test04_static关键字 {
    public static void main(String[] args) {
        SomeClass sc1 = new SomeClass();
        // 此时为静态变量赋值
        // sc1.name = "admin";
        // 静态变量一般通过类名.属性名访问
        // 表示该变量是属于当前类的
        SomeClass.name = "admin";
        // 实例变量只能通过对象名.属性名访问
        // 表示该变量是属于对应对象的
        sc1.age = 20;
        System.out.println("sc1:" + SomeClass.name);
        System.out.println("sc1:" + sc1.age);

        SomeClass sc2 = new SomeClass();
        // 此时修改了静态变量的值
        // 那么对于sc1而言,其访问的也是该变量
        SomeClass.name = "alice";
        sc2.age = 18;
        System.out.println("sc2:" + SomeClass.name);
        System.out.println("sc2:" + sc2.age);
        System.out.println("sc1:" + SomeClass.name);
        System.out.println("sc1:" + sc1.age);
        System.out.println("**************************************");
        // 静态方法可以通过类名.方法名直接访问
        SomeClass.test();
        // 也可以通过对象名.方法名访问
        sc1.test2();
        // 实例方法不能通过类名.方法名进行访问
        // SomeClass.show(); // 报错
        // 只能通过对象名.方法名访问
        sc1.show();
    }
}

class SomeClass {
    // 静态变量,类变量
    // 静态变量是属于类的,所有该类的对象共同拥有该属性
    // 只要有任意一个对象为该属性赋值,则其他所有该类的对象均同时赋值
    // 如果有任意一个对象修改了该属性的值,则其他所有该类的对象的属性值均随之改变
    static String name;
    // 实例变量
    int age;

    public void show() {
        System.out.println("这是实例方法");
        System.out.println("姓名:" + name + ",年龄:" + age);
        show2();
        test();
    }

    public void show2() {
        System.out.println("这是实例方法");
    }

    public static void test() {
        System.out.println("这是静态方法");
        // 在静态方法中,只能访问静态属性
        System.out.println("姓名:" + name);
        // 无法访问实例属性,报错
        // System.out.println("年龄:" + age);
        // 在静态方法中,只能访问静态方法
        test2();
        // 无法访问实例方法
        // show(); // 报错
    }

    public static void test2() {
        System.out.println("这是静态方法");
    }
}
